/**
 * 断言工具
 * @author luguoxiang
 * @date 2021-09-07
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
import { error } from './message';

/**
 * 抛异常
 * @param msg
 * @param showMsg
 */
function throwError(msg: Function | string, showMsg = true) {
  if (typeof msg === 'function') {
    msg();
    msg = '断言异常';
  } else if (showMsg) {
    error(msg);
  }
  throw msg || '断言异常';
}

/**
 * 断言结果为真
 * @param v
 * @param msg
 * @param showMsg
 */
export function isTrue(v: any, msg: Function | string, showMsg?: boolean) {
  if (!v) {
    throwError(msg, showMsg);
  }
}

/**
 * 断言结果为假
 * @param v
 * @param msg
 * @param showMsg
 */
export function isFalse(v: any, msg: Function | string, showMsg?: boolean) {
  isTrue(!v, msg, showMsg);
}

/**
 * 断言值不为空
 * @param v
 * @param msg
 * @param showMsg
 */
export function notNull(v: any, msg: Function | string, showMsg?: boolean) {
  if (v === null || v === undefined) {
    throwError(msg, showMsg);
  }
}

/**
 * 断言值为空
 * @param v
 * @param msg
 * @param showMsg
 */
export function isNull(v: any, msg: Function | string, showMsg?: boolean) {
  if (v !== null && v !== undefined) {
    throwError(msg, showMsg);
  }
}

/**
 * 断言值不是空（null, undefined, 空字符串、空对象、空数组）
 * @param v
 * @param msg
 * @param showMsg
 */
export function notEmpty(v: any, msg: Function | string, showMsg?: boolean) {
  switch (typeof v) {
    case 'number':
    case 'boolean':
      notNull(v, msg, showMsg);
      break;
    case 'object':
      if (!Array.isArray(v)) {
        v = Object.keys(v);
      }
      isTrue(v.length, msg, showMsg);
      break;
    default:
      isTrue(v, msg, showMsg);
      break;
  }
}

/**
 * 断言值是空（null, undefined, 空字符串、空对象、空数组）
 * @param v
 * @param msg
 * @param showMsg
 */
export function isEmpty(v: any, msg: Function | string, showMsg?: boolean) {
  switch (typeof v) {
    case 'number':
    case 'boolean':
      isNull(v, msg, showMsg);
      break;
    case 'object':
      if (!Array.isArray(v)) {
        v = Object.keys(v);
      }
      isFalse(v.length, msg, showMsg);
      break;
    default:
      isFalse(v, msg, showMsg);
      break;
  }
}
